/*
  ESP8266-NodeMCU无线终端模式连接WiFi
*/

#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库
#include <Ticker.h>
#define LED 2

const char *ssid = "AndyWiFi";        // 需要连接到的WiFi名
const char *password = "wangpengfei"; // 连接的WiFi密码

const char *host = "192.168.0.108"; // 修改为Server服务端的IP，即你电脑的IP，确保在同一网络之下。
WiFiClient client;                  // 声明一个客户端对象，用于与服务器进行连接
const int tcpPort = 8266;           // 修改为你建立的Server服务端的端口号，此端口号是创建服务器时指定的。
static String comdata = "";
static String val = "";

Ticker myTicker1;
Ticker myTicker2;
Ticker myTicker3;

void testT1(int t)
{
  while (client.available()) // available()表示是否可以获取到数据
  {
    //    char val = client.read();//read()表示从网络中读取数据。
    while (client.available() > 0) // 串口收到字符数大于零。
    {
      val += char(client.read());
    }
    client.print("text:" + val);
    val = ""; // 清空数据
  }
  ESP.wdtFeed();
}

void testT2(int t)
{
  Serial.println("Timer 2");
  digitalWrite(LED, 0);

  ESP.wdtFeed();
}

void testT3(int t)
{
  Serial.println("Timer 3");
  digitalWrite(LED, 1);
  ESP.wdtFeed();
}

void setup()
{
  Serial.begin(115200); // 初始化串口通讯波特率为115200
  pinMode(LED, OUTPUT);
  myTicker1.attach_ms(10, testT1, 23);
  myTicker3.attach_ms(400, testT3, 23);

  WiFi.mode(WIFI_STA);                // 设置Wifi工作模式为STA,默认为AP+STA模式
  WiFi.begin(ssid, password);         // 通过wifi名和密码连接到Wifi
  Serial.print("\r\nConnecting to "); // 串口监视器输出网络连接信息
  Serial.print(ssid);
  Serial.println(" ..."); // 显示NodeMCU正在尝试WiFi连接

  int i = 0;                            // 检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
  {                                     // 如果WiFi连接成功则返回值为WL_CONNECTED
    delay(1000);                        // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
    Serial.print("waiting for ");
    Serial.print(i++);
    Serial.println("s...");
  }

  Serial.println("");                // WiFi连接成功后
  Serial.println("WiFi connected!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address: ");      // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());    // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
  delay(3000);
  myTicker2.attach(3, testT2, 23);
}

void loop()
{
  while (!client.connected()) // 若未连接到服务端，则客户端进行连接。
  {
    if (!client.connect(host, tcpPort)) // 实际上这一步就在连接服务端，如果连接上，该函数返回true
    {
      Serial.println("connecting...");
      delay(500);
    }
  }
  // if(client.connect(host, tcpPort))
  //   client.println("This is ESP8266. Hello World.");//向服务器发送数据
  delay(100);
}
